#include "apue.h"
#include <setjmp.h>
#include <time.h>

void sig_usr1(int);
void sig_alrm(int);
static sigjmp_buf jmpbuf;
static volatile sig_atomic_t canjump = 0;

int main(void) {
    if (signal(SIGUSR1, sig_usr1) == SIG_ERR) 
        err_sys("signal(SIGUSR1) error");
    if (signal(SIGALRM, sig_alrm) == SIG_ERR)
        err_sys("signal(SIGALRM) error");

    if (sigsetjmp(jmpbuf, 1)) {
    // if (setjmp(jmpbuf)) {
        pr_mask("ending main:");
        _exit(0);
    }

    pr_mask("starting main:");
    canjump= 1;

    for (;;)
        pause();
}

void sig_usr1(int) {
    time_t starttime;
    if (canjump == 0) 
        return;
    starttime= time(NULL);
    pr_mask("staring sig_usr1:");
    alarm(3);

    for (;;) {
        if (time(NULL) >= starttime + 5)
            break; 
    }
    pr_mask("finishing sig_usr1:");
    // longjmp(jmpbuf, 1);
    siglongjmp(jmpbuf, 1);
}

void sig_alrm(int) {
    pr_mask("in sig_alrm:");
}


